package com.aiwiown.face.domain;

import com.aiwiown.face.ApiConstants;
import com.aiwiown.face.ApiException;
import com.aiwiown.face.ApiObject;
import com.aiwiown.face.domain.params.*;
import com.aiwiown.face.internal.mapping.ApiField;

import java.io.File;

/**
 * @ClassName : AppBizTokenModel
 * @Description :
 * @Author : dbin0123
 * @Date: 2020-03-15 17:58
 */
public class AppBizTokenModel extends ApiObject {
    private static final long serialVersionUID = 5335806078320445229L;

    /**
     * 活体验证流程的选择，目前仅取以下值：
     * <p>
     * meglive：动作活体
     * still：静默活体
     * flash：炫彩活体，通过打光进行活体验证，炫彩活体相较于静默活体安全性更高，但通过率会略有降低。
     * raw_image：不进行活体验证，仅使用上传的图片进行后续的比对
     */
    @ApiField(value = "liveness_type", paramType = ApiParamType.ENUM)
    private LivenessType livenessType;

    /**
     * 确定本次比对为“KYC验证”或“人脸比对”。取值只为“1”或“0”，取其他值返回错误码400（BAD_ARGUMENTS）。
     * 0：表示人脸比对，FaceID将使用客户自己提供的照片（参数image_ref[x]）作为比对人脸照。
     * 1：表示KYC验证，表示最终的用户照片将与参考照片进行比对。此外，如果没有“KYC验证”的权限，也不能设置此参数为“1”，否则返回错误码 403（AUTHORIZATION_ERROR:NO_DATA_SOURCE_PERMISSION）
     */
    @ApiField(value = "comparison_type", paramType = ApiParamType.ENUM)
    private ComparisonType comparisonType;

    /**
     * 需要核实对象的姓名，使用UTF-8编码。
     */
    @ApiField("idcard_name")
    private String idCardName;

    /**
     * 需要核实对象的证件号码，也就是一个18位长度的字符串。
     */
    @ApiField("idcard_number")
    private String idCardNumber;

    /**
     * 如果用户不使用参考数据进行比对，则上传此字段，用于标志本次识别对应的用户的唯一ID，要求不长于128字节。建议您对来自同一用户的比对请求使用同样的ID，这非常有利于您反查验证结果以及获得更好的监控报表体验
     */
    @ApiField("uuid")
    private String uuid;

    /**
     * 由客户提供的参照人脸照片。 如果在image_ref1、image_ref2中的任一张图片里没有找到人脸，将返回错误码400（NO_FACE_FOUND)； 如果这些图片中任一张中有多张脸，将选择最大人脸进行比对。
     */
    @ApiField(value = "image_ref1", paramType = ApiParamType.FILE)
    private File imageRef1;

    /**
     * 由客户提供的参照人脸照片。 如果在image_ref1、image_ref2中的任一张图片里没有找到人脸，将返回错误码400（NO_FACE_FOUND)； 如果这些图片中任一张中有多张脸，将选择最大人脸进行比对。
     */
    @ApiField(value = "image_ref2", paramType = ApiParamType.FILE)
    private File imageRef2;

    /**
     * “默认为空”。客户业务流水号，建议设置为您的业务相关的流水串号并且唯一，会在return时原封不动的返回给您的服务器，以帮助您确认对应业务的归属。此字段不超过128字节。
     */
    @ApiField("biz_no")
    private String bizNo;

    /**
     * 超时时间，示用户进入活体识别流程后的超时时间，若未在规定时间完成操作，则本次活体失败。
     * 超时时间设定：单位 秒， ∈ [5, 60]
     * 动作活体时，设置每个动作的超时时间，默认 10
     * 静默活体时，设置照镜子的超时时间，默认 60
     */
    @ApiField("liveness_timeout")
    private Integer livenessTimeout;

    /**
     * 活体类型控制四选一：动作活体时（liveness_type = meglive）
     * 配置动作活体时的动作个数：默认3个动作；默认 3， ∈ [1,3]
     */
    @ApiField(value = "liveness_action_count", paramType = ApiParamType.ENUM)
    private LivenessActionCount livenessActionCount;

    /**
     * 活体类型控制四选一：静默活体时（liveness_type = still）
     * 表示静默活体是否进行闭眼检测，取值如下：
     * 0：默认值，不进行睁闭眼检测；
     * 1：开启睁闭眼检测，若用户全程闭眼，则活体检测失败。
     */
    @ApiField(value = "eyes_close_detection", paramType = ApiParamType.ENUM)
    private EyesCloseDetection eyesCloseDetection;

    /**
     * 活体类型控制四选一：炫彩活体时（liveness_type = flash）
     * 设置炫彩活体的超时时间，默认值为 120秒。表示用户进入活体识别流程后的超时时间，若未在规定时间完成操作，则本次活体失败。
     * 超时时间设定：单位 秒， ∈ [60, 180]。若参数值超过限定范围，则返回BAD_ARGUMENTS错误。
     */
    @ApiField("flash_liveness_timeout")
    private Integer flashLivenessTimeout;

    /**
     * 活体类型控制四选一：无活体验证时（liveness_type = raw_image）
     * 待比对的人脸照片。当以这种方式调用时，该方法会首先检测出image中有几张人脸，并且判断最大的那张人脸的图像质量是否足够后续的比对。您可以通过设置可选参数fail_when_multiple_faces 和 face_quality_threshold来定义人脸检测方面的行为。
     */
    @ApiField(value = "image", paramType = ApiParamType.FILE)
    private File image;

    /**
     * 活体类型控制四选一：无活体验证时（liveness_type = raw_image）
     * 对待比对照作人脸检测时发现有多张脸，是否立即返回错误，或者取最大的一张脸继续比对。本参数取值只能是 “1” 或 "0" （缺省值为“1”）:
     * “1”: 立即返回错误码400（MULTIPLE_FACES）
     * “0”：取最大脸继续比对
     */
    @ApiField(value = "fail_when_multiple_faces", paramType = ApiParamType.ENUM)
    private FailWhenMultipleFaces failWhenMultipleFaces;

    /**
     * 活体类型控制四选一：无活体验证时（liveness_type = raw_image）
     * 待比对照中（人脸面积最大的一张）人脸图像质量分的阈值（缺省值为30）。待比对照人脸图像质量低于该阈值就直接返回错误码400（LOW_QUALITY）。本参数只能传入0至100的整数，传入其他整数或非整数字符串均返回错误码400（BAD_ARGUMENTS）。
     */
    @ApiField("face_quality_threshold")
    private Integer faceQualityThreshold;

    /**
     * 活体类型控制四选一：无活体验证时（liveness_type = raw_image）
     * 返回人脸检测结果。本参数取值只能是“1”或“0”（缺省值为“0”）:
     * “1”: 返回人脸检测结果(faces字段)；
     * “0”: 不返回人脸检测结果，只返回比对结果；
     * 其他值：返回错误码400（BAD_ARGUMENTS）
     * 注意：只要本参数设置为1，即使调用返回错误码400（LOW_QUALITY）、400（MULTIPLE_FACES）或400（NO_FACE_FOUND），返回结果里依然会包含faces字段。
     */
    @ApiField(value = "return_faces", paramType = ApiParamType.ENUM)
    private ReturnFaces returnFaces;

    /**
     * 表示返回数据的详细程度，取值如下：
     * 0：默认值，仅返回结论
     * 1：返回结论与摘要信息
     */
    @ApiField(value = "verbose", paramType = ApiParamType.ENUM)
    private Verbose verbose;

    /**
     * 表示对比对结果的严格程度限制，请根据您的场景，选择安全规则，越严格，准确性要求越高，通过率也会相应下降。
     * <p>
     * 1：宽松
     * 2：常规（默认值）
     * 3：严格
     * 4：非常严格
     */
    @ApiField(value = "security_level", paramType = ApiParamType.ENUM)
    private SecurityLevel securityLevel;

    /**
     * 表示云端算法判断为假脸后，是否依然进行比对结果
     * <p>
     * 0：默认值，不开启比对。云端判断为假脸，则直接返回结果，不执行比对，可以节省成本
     * 1：进行强制比对。云端判断为假脸后，但依然进行比对，此时result中将不返回假脸的结果，而返回比对的结果，风险情况您可以通过verification进行查看（需要设置verbose=1）。注：开启强制比对后，此条记录将被纳入计费逻辑。
     */
    @ApiField(value = "force_compare", paramType = ApiParamType.ENUM)
    private ForceCompare forceCompare;

    /**
     * 决定对于image_ref[x]参数对应的图片，当检测不出人脸时，是否旋转90度、180度、270度后再检测人脸。本参数取值只能是 “1” 或 "0" ；
     * <p>
     * 1：默认值，要旋转检测
     * 0：不旋转
     * 其他值：返回错误码400（BAD_ARGUMENTS）
     * <p>
     * 注意：设置此参数为1可能会轻微增加误检人脸的概率，如果您明确您的业务场景里不存在非正向的人脸图片、或概率极低，建议勿设置此参数。
     */
    @ApiField(value = "multi_oriented_detection", paramType = ApiParamType.ENUM)
    private MultiOrientedDetection multiOrientedDetection;

    /**
     * 表示活体SDK端严格等级（当前仅静默活体使用），取值如下：
     * 0：严格模式，默认值
     * 1：标准模式
     * 2：极速模式
     */
    @ApiField(value = "liveness_level", paramType = ApiParamType.ENUM)
    private LivenessLevel livenessLevel;

    /**
     * 表示活体SDK进入活体时是否将屏幕亮度调到最大，取值如下：
     * 0：默认值，不做额外调整
     * 1：调整到最大亮度
     * 注意：本参数仅针对V3.3.3以上SDK中动作与静默生效
     */
    @ApiField(value = "maximum_brightness", paramType = ApiParamType.ENUM)
    private MaximumBrightness maximumBrightness;


    public LivenessType getLivenessType() {
        return livenessType;
    }

    public void setLivenessType(LivenessType livenessType) {
        this.livenessType = livenessType;
    }

    public ComparisonType getComparisonType() {
        return comparisonType;
    }

    public void setComparisonType(ComparisonType comparisonType) {
        this.comparisonType = comparisonType;
    }

    public String getIdCardName() {
        return idCardName;
    }

    public void setIdCardName(String idCardName) {
        this.idCardName = idCardName;
    }

    public String getIdCardNumber() {
        return idCardNumber;
    }

    public void setIdCardNumber(String idCardNumber) {
        this.idCardNumber = idCardNumber;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public File getImageRef1() {
        return imageRef1;
    }

    public void setImageRef1(File imageRef1) {
        this.imageRef1 = imageRef1;
    }

    public File getImageRef2() {
        return imageRef2;
    }

    public void setImageRef2(File imageRef2) {
        this.imageRef2 = imageRef2;
    }

    public String getBizNo() {
        return bizNo;
    }

    public void setBizNo(String bizNo) {
        this.bizNo = bizNo;
    }

    public Integer getLivenessTimeout() {
        return livenessTimeout;
    }

    /**
     * 超时时间，示用户进入活体识别流程后的超时时间，若未在规定时间完成操作，则本次活体失败。
     * <p>
     * 超时时间设定：单位 秒， ∈ [5, 60]
     * <p>
     * 动作活体时，设置每个动作的超时时间，默认 10
     * 静默活体时，设置照镜子的超时时间，默认 60
     *
     * @param livenessTimeout 超时时间
     */
    public void setLivenessTimeout(Integer livenessTimeout) throws ApiException {
        if (livenessTimeout < 5 || livenessTimeout > 60) {
            throw new ApiException(ApiConstants.BAD_ARGUMENTS_CODE, " livenessTimeout value is out of range, ∈[5,60]；");
        }

        this.livenessTimeout = livenessTimeout;
    }

    public LivenessActionCount getLivenessActionCount() {
        return livenessActionCount;
    }

    public void setLivenessActionCount(LivenessActionCount livenessActionCount) {
        this.livenessActionCount = livenessActionCount;
    }

    public EyesCloseDetection getEyesCloseDetection() {
        return eyesCloseDetection;
    }

    public void setEyesCloseDetection(EyesCloseDetection eyesCloseDetection) {
        this.eyesCloseDetection = eyesCloseDetection;
    }

    public Integer getFlashLivenessTimeout() {
        return flashLivenessTimeout;
    }

    /**
     * 设置炫彩活体的超时时间，默认值为 120秒。表示用户进入活体识别流程后的超时时间，若未在规定时间完成操作，则本次活体失败。
     * <p>
     * 超时时间设定：单位 秒， ∈ [60, 180]。若参数值超过限定范围，则返回BAD_ARGUMENTS错误。
     *
     * @param flashLivenessTimeout
     */
    public void setFlashLivenessTimeout(Integer flashLivenessTimeout) throws ApiException {
        if (flashLivenessTimeout < 60 || flashLivenessTimeout > 180) {
            throw new ApiException(ApiConstants.BAD_ARGUMENTS_CODE, " flashLivenessTimeout value is out of range, ∈[60,180]；");
        }
        this.flashLivenessTimeout = flashLivenessTimeout;
    }

    public File getImage() {
        return image;
    }

    public void setImage(File image) {
        this.image = image;
    }

    public FailWhenMultipleFaces getFailWhenMultipleFaces() {
        return failWhenMultipleFaces;
    }

    public void setFailWhenMultipleFaces(FailWhenMultipleFaces failWhenMultipleFaces) {
        this.failWhenMultipleFaces = failWhenMultipleFaces;
    }

    public Integer getFaceQualityThreshold() {
        return faceQualityThreshold;
    }

    /**
     * 待比对照中（人脸面积最大的一张）人脸图像质量分的阈值（缺省值为30）。待比对照人脸图像质量低于该阈值就直接返回错误码400（LOW_QUALITY）。
     * 本参数只能传入0至100的整数，传入其他整数或非整数字符串均返回错误码400（BAD_ARGUMENTS）。
     *
     * @param faceQualityThreshold
     */
    public void setFaceQualityThreshold(Integer faceQualityThreshold) throws ApiException {
        if (faceQualityThreshold < 0 || faceQualityThreshold > 100) {
            throw new ApiException(ApiConstants.BAD_ARGUMENTS_CODE, " faceQualityThreshold value is out of range, ∈[0,100]；");
        }
        this.faceQualityThreshold = faceQualityThreshold;
    }

    public ReturnFaces getReturnFaces() {
        return returnFaces;
    }

    public void setReturnFaces(ReturnFaces returnFaces) {
        this.returnFaces = returnFaces;
    }

    public Verbose getVerbose() {
        return verbose;
    }

    public void setVerbose(Verbose verbose) {
        this.verbose = verbose;
    }

    public SecurityLevel getSecurityLevel() {
        return securityLevel;
    }

    public void setSecurityLevel(SecurityLevel securityLevel) {
        this.securityLevel = securityLevel;
    }

    public ForceCompare getForceCompare() {
        return forceCompare;
    }

    public void setForceCompare(ForceCompare forceCompare) {
        this.forceCompare = forceCompare;
    }

    public MultiOrientedDetection getMultiOrientedDetection() {
        return multiOrientedDetection;
    }

    public void setMultiOrientedDetection(MultiOrientedDetection multiOrientedDetection) {
        this.multiOrientedDetection = multiOrientedDetection;
    }

    public LivenessLevel getLivenessLevel() {
        return livenessLevel;
    }

    public void setLivenessLevel(LivenessLevel livenessLevel) {
        this.livenessLevel = livenessLevel;
    }

    public MaximumBrightness getMaximumBrightness() {
        return maximumBrightness;
    }

    public void setMaximumBrightness(MaximumBrightness maximumBrightness) {
        this.maximumBrightness = maximumBrightness;
    }
}
